package com.crazymakercircle.im.common.codec;

import com.crazymakercircle.im.common.bean.msg.ProtoMsg;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import lombok.extern.slf4j.Slf4j;

/**
 * <p>Title: ProtobufEncoder</p>
 *  (1)写入待发送的Protobuf POJO实例的二进制字节长度；
 * （2)写入其他的字段，如魔数、版本号；
 * （3)写入Protobuf POJO实例的二进制字节码内容。
 * @author: dwLiu
 * @date: 2021/11/23 17:32
 */
@Slf4j
public class ProtobufEncoder extends MessageToByteEncoder<ProtoMsg.Message> {
    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, ProtoMsg.Message message, ByteBuf byteBuf) throws Exception {
        //将对象转换为字节
        byte[] bytes = message.toByteArray();
        //读取消息的长度
        int length = bytes.length;
        /**
         * 这里写入的消息长度，调用了 writeShort（length）方法，长度仅仅两个字节，表明
         * 了数据包最大的净负荷长度为 32767 个字节（有符号的短整型）。如果数据包的长度较大，需
         * 要传输更多的内容，可以调用 writeInt（length）方法写入长度
         */
        //将消息长度写入，这里只用两个字节，最大为32767
        byteBuf.writeShort(length);
        //省略魔数，版本的写入，写入方式与写入长度类似
        //消息体中包含我们要发送的数据
        byteBuf.writeBytes(bytes);
    }
}
